
package org.sql.commands.mysql.clause;

// *************************************************************************/
// Charada Soft
// Area de Desarrollo de Sistemas de Información
// *************************************************************************/
// Proyecto : java connector sql 
// Archivo : GroupBy.java
// Descripcion : Clase GroupBy
// *************************************************************************/
// Version : 2.10.4
// Fecha de Creación: 26 de Septiembre de 2014
// Author : Daniel Andres Castillo Pedroza
// *************************************************************************/

import java.util.ArrayList;
import org.sql.commands.Clause;
import org.sql.commands.exception.DMLException;
import org.sql.commands.mysql.command.ConfiguratorCommand;

public class GroupBy implements Clause {
    
    // Atributos de la clase GroupBy
    
    private ArrayList <String> columns;
    private boolean isRollup;
    
    // Constructor de la clase GroupBy
    
    public GroupBy() {
      columns = new ArrayList();
    }
    
    // Metodos de la clase GroupBy
    
    /**
      * 
      * @param columns 
    */
    
    public void setColumns(ArrayList <String> columns) {
      this.columns = columns;
    }
    
    /**
      * 
      * @param column 
    */
    
    public void addColumn(String column) {
      columns.add(column);
    }
    
    /**
      * 
      * @param isRollup 
    */
    
    public void setRollup(boolean isRollup) {
      this.isRollup = isRollup;
    }
    
    // Metodos estáticos de la clase GroupBy
    
    /**
      * 
      * @param column
      * @return 
    */
    
    public static GroupBy creatorClause(String column) {
      GroupBy groupBy = new GroupBy(); groupBy.addColumn(column);
      
      return groupBy; // Retornando Objeto GROUP BY
    }
    
    /**
      * 
      * @param columns
      * @return 
    */
    
    public static GroupBy creatorClause(ArrayList <String> columns) {
      GroupBy groupBy = new GroupBy(); groupBy.setColumns(columns);
      
      return groupBy; // Retornando Objeto GROUP BY
    }
    
    // Metodos sobreescritos de la clase GroupBy

    @Override
    public String getClause() throws DMLException {
      if ((columns == null) || (columns.isEmpty())) {
        throw new DMLException(DMLException.COLUMNS_UNDEFINED);
      } // No ha definido las Columnas de la Sentencia
      
      String clauseGroupBy = "GROUP BY"; // Declarando dato para Proceso
      
      clauseGroupBy += " " + ConfiguratorCommand.columnsForCommand(columns);
      
      if (isRollup) {
        clauseGroupBy += " WITH ROLLUP";
      } // Se ha establecido el ROLLUP en Clausula
      
      return clauseGroupBy; // Retornando Clausula GROUP BY
    }
}